<template>
  <!-- 自定义右上角的置顶、最小化、最大化、关闭按钮等 -->
  <div :class="['win-op', 'no-drag', isFixed ? 'fixed' : '']">
    <div class="tool-icon" v-if="showSetTop" :title="isTop ? '取消置顶' : '置顶'" @click="top">
      <svg-icon name="top" :color="isTop ? '#07c160' : ''" />
    </div>
    <div class="tool-icon" v-if="showMin" title="最小化" @click="minimize">
      <svg-icon name="min" />
    </div>
    <div class="tool-icon" v-if="showMax" :title="isMax ? '向下还原' : '最大化'" @click="maximize">
      <svg-icon :name="isMax ? 'max' : 'maximize'" />
    </div>
    <div class="tool-icon tool-icon-close" v-if="showClose" title="关闭" @click="close">
      <svg-icon name="close" />
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
import * as window from '@tauri-apps/api/window'
import { invoke } from "@tauri-apps/api/core";
const currentWindow = window.getCurrentWindow()

// 存储事件监听引用
let closeRequestListener = null;

const props = defineProps({
  // 置顶
  showSetTop: { type: Boolean, default: true },
  // 最小化
  showMin: { type: Boolean, default: true },
  // 最大化
  showMax: { type: Boolean, default: true },
  // 关闭
  showClose: { type: Boolean, default: true },
  //关闭类型 0:关闭，1:隐藏
  closeType: { type: Number, default: 1 },
  // @desc：是否把窗口固定在右上角
  // 默认true，大部分都是固定在右上角的，fixed定位；否则是常规的div，可自由放置布局
  isFixed: { type: Boolean, default: true }
})

const emit = defineEmits(['closeCallback'])

// 处理系统关闭请求（任务栏缩略图关闭按钮等）
// 注意：这里有退出登录的逻辑，退出后可以关闭窗口，不做限制
async function handleCloseRequest(event) {
  try {
    // 仅对聊天窗口应用特殊处理
    const curWinLabel = currentWindow.label
    if (curWinLabel === 'chat') {
      // 仅对已登录状态做限制，因为涉及到退出登录，需要销毁chat窗口
      const loginStatus = await invoke('get_login_status');
      if(loginStatus) {
        console.log('拦截系统关闭请求，应用隐藏而非关闭');
        event.preventDefault(); // 阻止默认关闭行为
        await currentWindow.hide(); // 隐藏窗口
        await currentWindow.setSkipTaskbar(true); // 设置任务栏不可见
      }
    }
    // 这里就不要监听了，因为登录成功后也会销毁登录窗口，监听的话就直接退出应用了
    // if(curWinLabel === 'login') {
    //   console.log('拦截系统关闭请求，应用退出');
    //   event.preventDefault(); // 阻止默认关闭行为
    //   await invoke('app_exit')
    // }
  } catch (error) {
    console.error('处理关闭请求时出错:', error);
  }
}

// 组件挂载时注册事件监听
onMounted(async () => {
  try {
    // 检查window API是否支持事件监听
    if (currentWindow && currentWindow.onCloseRequested) {
      // 使用标准的Tauri事件监听方式
      closeRequestListener = await currentWindow.onCloseRequested(handleCloseRequest);
      console.log('关闭请求事件监听已注册');
    }
  } catch (error) {
    console.error('注册关闭请求事件监听失败:', error);
  }
});

// 组件卸载时移除事件监听
onBeforeUnmount(() => {
  try {
    if (closeRequestListener && typeof closeRequestListener === 'function') {
      closeRequestListener(); // 调用取消监听函数
      console.log('关闭请求事件监听已移除');
    }
  } catch (error) {
    console.error('移除关闭请求事件监听失败:', error);
  }
});

// 窗口操作设置
const setWindow = async (action, data) => {
  switch (action) {
    case 'minimize':
      await currentWindow.minimize()
      break
    case 'maximize':
      await currentWindow.maximize()
      break
    case 'unMaximize':
      await currentWindow.unmaximize()
      break
    case 'close':
      // 如果是聊天窗口，则隐藏，并设置任务栏不可见，否则关闭窗口
      if(currentWindow.label === 'chat') {
        await currentWindow.hide()
        await currentWindow.setSkipTaskbar(true)
      } else if(currentWindow.label === 'login') {
        // 登录窗口：直接退出应用，因为关了窗口就没了
        await invoke('app_exit')
      } else {
        await currentWindow.close()
      }
      break
    case 'top':
      await currentWindow.setAlwaysOnTop(data.top)
      break
  }
}

//关闭窗口
const close = () => {
  setWindow('close', { closeType: props.closeType })
  emit('closeCallback')
}
//最小化
const minimize = () => {
  setWindow('minimize')
}

const isMax = ref(false)
const isTop = ref(false)

//最大化
const maximize = () => {
  if (isMax.value) {
    setWindow('unMaximize')
    isMax.value = false
  } else {
    setWindow('maximize')
    isMax.value = true
  }
}

//置顶窗口
const top = () => {
  isTop.value = !isTop.value
  setWindow('top', { top: isTop.value })
}
</script>

<style lang="scss" scoped>
.fixed {
  top: 0;
  right: 0;
  position: absolute;
  z-index: 10;
}
.win-op {
  display: flex;

  .tool-icon {
    padding: 0 13px;
    line-height: 30px;
    &:hover {
      background-color: #ddd;
    }
  }

  .tool-icon-close {

    &:hover {
      background: #fb7373;
      color: #fff;
    }
  }

  .win-top {
    color: #07c160;
  }
}

</style>
